/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.base.eao.EaoException;
import br.jm.acionista.entity.*;
import br.jm.acionista.filter.Funcoes;
import br.jm.acionista.sistema.eao.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import org.primefaces.context.RequestContext;
import org.primefaces.event.RowEditEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class CautelaBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Cautela selectedCautela;
    private CautelaAcionista selectedCautelaAcionista;
    private LazyDataModel<Cliente> lazyModel;
    private CautelaEao CautelaJpa;
    private CautelaAcionistaEao CautelaAcionistaJpa;
    private List<Cautela> CautelaList;
    private List<CautelaAcionista> CautelaAcionistaList;
    private LazyDataModel<Cautela> lazyModelEdital;
    private EditalCautela selectedEditalCautela;
    private EditalCautelaAcionista selectedEditalCautelaAcionista;
    private List<EditalCautelaAcionista> EditalCautelaAcionistaList;
    private EditalCautelaEao EditalCautelaJpa;
    private EditalCautelaAcionistaEao EditalCautelaAcionistaJpa;
    private ClienteEao clienteJpa;
    private TipoTransferencia selectedTipoTransferencia;
    private TipoTransferenciaEao tipoTransferenciaJpa;
    private Livro selectedLivro;
    private LivroEao livroJpa;
    private List<Cliente> selectedClientes;
    private List<Cliente> clienteList;
    private Cliente selectedCliente;
    private Cliente clienteTrans;
    private Cliente cliente;
    private Cliente clienteTemp;
    private Cliente clienteTransferencia;
    private FacesMessage msg = null;
    private String dataatual;
    private Funcoes funcoes = new Funcoes();
    private EntityManager sessao;
    private int nTotalReg;
    private BigDecimal vlrUnit;
    private BigDecimal vlrTotal;
    private BigDecimal totTrans;
    private BigDecimal totReceb;
    private BigDecimal totPerc;
    private BigDecimal totValor;
    private BigDecimal totRest;
    private BigDecimal totPercRest;
    private BigDecimal totValorRest;
    private String ctotReceb;
    private String ctotPerc;
    private String ctotValor;
    private String ctotRest;
    private String ctotPercRest;
    private String ctotValorRest;
    private String numEdital;
    private int idCedente;
    private int idTipo;
    private int idEdital;
    private int idCautela;
    private boolean lSessao;
    private Anotacao anotacaoCedente;
    private Anotacao anotacaoCessionario;
    private EmpresaEao empresaJpa;
    private Empresa selectedEmpresa;
    private boolean lPassa;
    private String cSql;
    private boolean disable;
    private RelatorioCertificado selectedCertificado;
    private RelatorioCertificadoEao relatorioCertificadoJpa;
    private ClienteParticipacao selectedClienteParticipacao;
    private ClienteParticipacaoPK selectedClienteParticipacaoPK;
    private ClienteParticipacaoEao ClienteParticipacaoJpa;

    public CautelaBean() throws EaoException {
        CautelaJpa = CautelaEao.getInstance();
        CautelaAcionistaJpa = CautelaAcionistaEao.getInstance();
        EditalCautelaJpa = EditalCautelaEao.getInstance();
        EditalCautelaAcionistaJpa = EditalCautelaAcionistaEao.getInstance();
        clienteJpa = ClienteEao.getInstance();
        livroJpa = LivroEao.getInstance();
        tipoTransferenciaJpa = TipoTransferenciaEao.getInstance();
        empresaJpa = EmpresaEao.getInstance();
        ClienteParticipacaoJpa = ClienteParticipacaoEao.getInstance();
        relatorioCertificadoJpa = RelatorioCertificadoEao.getInstance();

        selectedCliente = new Cliente();
        clienteTrans = new Cliente();
        cliente = new Cliente();
        clienteTemp = new Cliente();
        clienteTransferencia = new Cliente();
        selectedEmpresa = new Empresa();

        selectedLivro = new Livro();
        selectedTipoTransferencia = new TipoTransferencia();
        selectedClientes = new ArrayList<Cliente>();
        selectedCautela = new Cautela();
        selectedCautelaAcionista = new CautelaAcionista();
        selectedEditalCautela = new EditalCautela();
        selectedEditalCautelaAcionista = new EditalCautelaAcionista();
        EditalCautelaAcionistaList = new ArrayList<EditalCautelaAcionista>();

        dataatual = funcoes.ConverteDateString(new Date());

        totTrans = BigDecimal.ZERO;
        vlrUnit = BigDecimal.ZERO;
        vlrTotal = BigDecimal.ZERO;

        totReceb = BigDecimal.ZERO;
        totPerc = BigDecimal.ZERO;
        totValor = BigDecimal.ZERO;

        totRest = BigDecimal.ZERO;
        totPercRest = BigDecimal.ZERO;
        totValorRest = BigDecimal.ZERO;

        totTrans = totTrans.setScale(0, BigDecimal.ROUND_HALF_EVEN);

        vlrUnit = vlrUnit.setScale(2, BigDecimal.ROUND_HALF_EVEN);
        vlrTotal = vlrTotal.setScale(2, BigDecimal.ROUND_HALF_EVEN);

        totReceb = totReceb.setScale(0, BigDecimal.ROUND_HALF_EVEN);
        totPerc = totPerc.setScale(4, BigDecimal.ROUND_HALF_EVEN);
        totValor = totValor.setScale(2, BigDecimal.ROUND_HALF_EVEN);

        totRest = totRest.setScale(0, BigDecimal.ROUND_HALF_EVEN);
        totPercRest = totPercRest.setScale(4, BigDecimal.ROUND_HALF_EVEN);
        totValorRest = totValorRest.setScale(2, BigDecimal.ROUND_HALF_EVEN);

        this.ctotReceb = "0";
        this.ctotPerc = "0,0000";
        this.ctotValor = "0,00";

        this.ctotRest = "0";
        this.ctotPercRest = "0,0000";
        this.ctotValorRest = "0,00";

        lSessao = true;
        lPassa = true;
        disable = true;

        // Grid Intencao de compra
        cliente = new Cliente();

        cSql = "select id_livro,dat_abertura,dat_fechamento,num_folha_final,num_folha_inic,num_livro "
                + "from livro "
                + "where dat_fechamento is null";
        this.selectedLivro = livroJpa.getNativeFiltro(cSql);

        // Grid Transferencia
        lazyModelEdital = new LazyDataModel<Cautela>() {

            @Override
            public List<Cautela> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {

                List<Cautela> lazyCautela = new ArrayList<Cautela>();

                try {
                    lazyCautela = CautelaJpa.getNative("Cautela", first, pageSize, sortField, sortOrder, filters, null, "id_tipo > 1 ");
                } catch (Exception ex) {
                    Logger.getLogger(CautelaBean.class.getName()).log(Level.SEVERE, null, ex);
                }
                return lazyCautela;
            }
        };

        nTotalReg = CautelaJpa.getCount("Cautela");
        if (nTotalReg == 0) {
            nTotalReg = 1;
            selectedCautela = new Cautela();
        }
        lazyModelEdital.setRowCount(nTotalReg);

        // Grid escolha Cessionarios
        lazyModel = new LazyDataModel<Cliente>() {

            @Override
            public List<Cliente> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {

                List<Cliente> lazyCliente = new ArrayList<Cliente>();

                try {
                    lazyCliente = clienteJpa.getNative("Cliente", first, pageSize, sortField, sortOrder, filters, null);
                } catch (Exception ex) {
                    Logger.getLogger(CautelaBean.class.getName()).log(Level.SEVERE, null, ex);
                }
                return lazyCliente;
            }
        };

        nTotalReg = clienteJpa.getCount("Cliente");
        if (nTotalReg == 0) {
            nTotalReg = 1;
            clienteTrans = new Cliente();
        }
        lazyModel.setRowCount(nTotalReg);
    }

    public void inserirTransferencia(ActionEvent actionEvent) throws EaoException {
        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();

        lPassa = true;
        boolean lFechar = false;

        try {
            verificaValorTransferencia(actionEvent);

            if (this.clienteList == null) {
                this.clienteList = new ArrayList<Cliente>();
            }

            BigDecimal nTotalTransferencia = BigDecimal.ZERO;
            for (int i = 0; i < clienteList.size(); i++) {
                clienteTemp = new Cliente();
                clienteTemp = clienteList.get(i);
                nTotalTransferencia = nTotalTransferencia.add(clienteTemp.getQdeFinal());
            }

            if (nTotalTransferencia.compareTo(this.totTrans) != 0) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Qde. Total Diferente da Qde. Definida!", "");
            }

            if (lPassa) {
                cSql = "select id_livro,dat_abertura,dat_fechamento,num_folha_final,num_folha_inic,num_livro "
                        + "from livro "
                        + "where dat_fechamento is null";
                this.selectedLivro = livroJpa.getNativeFiltro(cSql);
                
                selectedEmpresa = empresaJpa.getPorId(1);

                BigDecimal nNumTransferencia = selectedEmpresa.getNumTransferencia();
                BigDecimal nNumCertificado = selectedEmpresa.getNumCertificado();
                
                CautelaList = new ArrayList<Cautela>();
                
                this.sessao = CautelaJpa.openSessaoLote();
                CautelaJpa.openTransaction(this.sessao);

                this.cliente.setIdCliente(idCedente);
                this.anotacaoCedente = new Anotacao();
                this.anotacaoCessionario = new Anotacao();

                if (selectedTipoTransferencia.getIdTipo() == 5) {
                    anotacaoCedente.setIdAnotacao(7);
                    anotacaoCessionario.setIdAnotacao(7);
                } else {
                    anotacaoCedente.setIdAnotacao(3);
                    anotacaoCessionario.setIdAnotacao(2);
                }

                for (int i = 0; i < clienteList.size(); i++) {
                    nNumTransferencia = nNumTransferencia.add(new BigDecimal(1));

                    clienteTrans = new Cliente();
                    clienteTrans = clienteList.get(i);

                    // Atualiza o saldo atual do Cedente
                    cliente = clienteJpa.getPorId(cliente.getIdCliente(), "S", this.sessao);
                    BigDecimal nTotal = cliente.getQdeAcao().subtract(clienteTrans.getQdeFinal());
                    if (nTotal.compareTo(new BigDecimal(0)) < 0) {
                        nTotal = new BigDecimal(0);
                    } 
                    cliente.setQdeAcao(nTotal);
                    clienteJpa.edit(cliente, "S", this.sessao);
                    
                    // grava Transferencia do Cedente
                    selectedCautela = new Cautela();
                    selectedCautela.setIdCautela(null);
                    selectedCautela.setDatCautela(new Date());
                    selectedCautela.setCautelaAcionistaList(null);
                    selectedCautela.setIdCliente(cliente);
                    selectedCautela.setIdLivro(selectedLivro);
                    selectedCautela.setIdTipo(selectedTipoTransferencia);
                    selectedCautela.setQdeTotal(clienteTrans.getQdeFinal());
                    selectedCautela.setVlrUnit(vlrUnit);
                    selectedCautela.setNumCautela("0");
                    selectedCautela.setIdAnotacao(anotacaoCedente);
                    selectedCautela.setNumTransferencia(nNumTransferencia);
                    selectedCautela.setNumCertificado(new BigDecimal(0));
                    selectedCautela.setQdeAcao(cliente.getQdeAcao());
                    CautelaJpa.create(selectedCautela, "S", this.sessao);
                    
                    // Guarda os dados do Cedente
                    CautelaList.add(selectedCautela);

                    // Atualiza o saldo atual do Cessionario
                    clienteTemp = new Cliente();
                    clienteTemp = clienteJpa.getPorId(clienteTrans.getIdCliente(), "S", this.sessao);
                    clienteTemp.setQdeAcao(clienteTemp.getQdeAcao().add(clienteTrans.getQdeFinal()));
                    clienteJpa.edit(clienteTemp, "S", this.sessao);
                    
                    // Gera Certificado do Cessionario
                    if (clienteTemp.getQdeAcao().compareTo(BigDecimal.ZERO) > 0) {
                        nNumCertificado = nNumCertificado.add(new BigDecimal(1));

                        cSql = "delete from relatorio_certificado where id_cliente = ".concat(clienteTemp.getIdCliente().toString());
                        clienteJpa.executeUpdate(cSql, "S", this.sessao);

                        selectedCertificado = new RelatorioCertificado();
                        selectedCertificado.setIdCautela(null);
                        selectedCertificado.setDatCautela(new Date());
                        selectedCertificado.setIdCliente(clienteTemp);
                        selectedCertificado.setNumCertificado(nNumCertificado);
                        relatorioCertificadoJpa.create(selectedCertificado, "S", this.sessao);

                        clienteTemp.setImpresso(1);
                        clienteJpa.edit(clienteTemp, "S", this.sessao);
                    }
                    
                    // Grava o Cessionario
                    selectedCautelaAcionista = new CautelaAcionista();
                    selectedCautelaAcionista.setIdCautela(selectedCautela);
                    selectedCautelaAcionista.setIdCautelaacionista(null);
                    selectedCautelaAcionista.setIdCliente(clienteTemp);
                    selectedCautelaAcionista.setQdeAcao(clienteTemp.getQdeAcao());
                    selectedCautelaAcionista.setQdeProposta(clienteTemp.getQdeAcao());
                    selectedCautelaAcionista.setQdeReceb(clienteTrans.getQdeFinal());
                    selectedCautelaAcionista.setIdAnotacao(anotacaoCessionario);
                    selectedCautelaAcionista.setNumTransferencia(nNumTransferencia);
                    selectedCautelaAcionista.setDatCautela(new Date());
                    selectedCautelaAcionista.setIdLivro(selectedLivro);
                    selectedCautelaAcionista.setNumCautela("0");
                    selectedCautelaAcionista.setIdCedente(idCedente);
                    selectedCautelaAcionista.setNumCertificado(nNumCertificado);
                    selectedCautelaAcionista.setPercPartic(clienteTemp.getPercPartic());

                    CautelaAcionistaJpa.create(selectedCautelaAcionista, "S", this.sessao);

                    // Atualiza percentual participacao
                    selectedClienteParticipacaoPK = new ClienteParticipacaoPK();
                    selectedClienteParticipacaoPK.setDatPartic(new Date());
                    selectedClienteParticipacaoPK.setIdCliente(clienteTemp.getIdCliente());

                    selectedClienteParticipacao = ClienteParticipacaoJpa.getPorId(selectedClienteParticipacaoPK, "S", this.sessao);

                    if (selectedClienteParticipacao == null) {
                        selectedClienteParticipacao = new ClienteParticipacao();

                        selectedClienteParticipacao.setCliente(clienteTemp);
                        selectedClienteParticipacao.setClienteParticipacaoPK(selectedClienteParticipacaoPK);
                        selectedClienteParticipacao.setPercPartic(clienteTemp.getPercPartic());

                        ClienteParticipacaoJpa.create(selectedClienteParticipacao, "S", this.sessao);

                        selectedClienteParticipacao = null;
                    } else {
                        selectedCliente = clienteJpa.getPorId(clienteTemp.getIdCliente(), "S", this.sessao);

                        selectedClienteParticipacao.setCliente(clienteTemp);
                        selectedClienteParticipacao.setClienteParticipacaoPK(selectedClienteParticipacaoPK);
                        selectedClienteParticipacao.setPercPartic(clienteTemp.getPercPartic());

                        ClienteParticipacaoJpa.edit(selectedClienteParticipacao, "S", this.sessao);
                    }
                }

                // Gera Certificado do Cedente
                if (cliente.getQdeAcao().compareTo(BigDecimal.ZERO) > 0) {
                    nNumCertificado = nNumCertificado.add(new BigDecimal(1));
                    
                    cSql = "delete from relatorio_certificado where id_cliente = ".concat(cliente.getIdCliente().toString());
                    clienteJpa.executeUpdate(cSql, "S", this.sessao);

                    selectedCertificado = new RelatorioCertificado();
                    selectedCertificado.setIdCautela(null);
                    selectedCertificado.setDatCautela(new Date());
                    selectedCertificado.setIdCliente(cliente);
                    selectedCertificado.setNumCertificado(nNumCertificado);
                    relatorioCertificadoJpa.create(selectedCertificado, "S", this.sessao);

                    cliente.setImpresso(1);
                    clienteJpa.edit(cliente, "S", this.sessao);
                    
                    for (int i = 0; i < CautelaList.size(); i++) {
                        selectedCautela = CautelaList.get(i);
                        selectedCautela.setNumCertificado(nNumCertificado);
                        selectedCautela.setQdeAcao(cliente.getQdeAcao());
                        CautelaJpa.edit(selectedCautela, "S", this.sessao);
                    }
                } else {
                    for (int i = 0; i < CautelaList.size(); i++) {
                        selectedCautela = CautelaList.get(i);
                        selectedCautela.setNumCertificado(new BigDecimal(0));
                        selectedCautela.setQdeAcao(cliente.getQdeAcao());
                        CautelaJpa.edit(selectedCautela, "S", this.sessao);
                    }
                }
                
                selectedEmpresa.setNumTransferencia(nNumTransferencia);
                selectedEmpresa.setNumCertificado(nNumCertificado);
                empresaJpa.edit(selectedEmpresa, "S", this.sessao);

                CautelaJpa.closeTransaction(this.sessao);

                // Atualiza os percetuais de participacao
                selectedEmpresa = empresaJpa.getPorId(1);
                cSql = "update cliente "
                        + "set perc_partic = (qde_acao / ".concat(selectedEmpresa.getQdeTotal().toString()).concat(" ) * 100 ");

                clienteJpa.executeUpdate(cSql);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Inclusão da Transferência efetuada com Sucesso!", "");
            }
        } catch (Exception ex) {
            if (this.sessao.isOpen()) {
                CautelaJpa.closeSessaoRollback(this.sessao);
            }
            lPassa = false;
            novo();
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Erro do Sistema... Verifique se a Transferência já Existe!", "");
        } finally {
            this.sessao = null;
            if (lPassa) {
                novo();
                lFechar = true;
            }
            FacesContext.getCurrentInstance().addMessage(null, msg);

            context.addCallbackParam("loggedIn", lPassa);
            context.addCallbackParam("fechar", lFechar);
        }
    }

    public void excluirTransferencia(ActionEvent actionEvent) throws EaoException {
        msg = null;
        lPassa = true;
        String cFiltro = null;

        try {
            this.sessao = CautelaJpa.openSessaoLote();
            CautelaJpa.openTransaction(this.sessao);

            // ATUALIZA OS SALDOS DOS CEDENTE E CESSIONARIO
            for (int i = 0; i < clienteList.size(); i++) {
                clienteTrans = new Cliente();
                clienteTrans = clienteList.get(i);

                // Atualiza o saldo atual do Cedente
                cliente = clienteJpa.getPorId(cliente.getIdCliente(), "S", this.sessao);
                cliente.setQdeAcao(cliente.getQdeAcao().add(clienteTrans.getQdeFinal()));
                cliente.setImpresso(0);
                clienteJpa.edit(cliente, "S", this.sessao);

                // Atualiza o saldo atual do Cessionario
                clienteTemp = new Cliente();
                clienteTemp = clienteJpa.getPorId(clienteTrans.getIdCliente(), "S", this.sessao);
                clienteTemp.setQdeAcao(clienteTemp.getQdeAcao().subtract(clienteTrans.getQdeFinal()));
                clienteTemp.setImpresso(0);
                clienteJpa.edit(clienteTemp, "S", this.sessao);
            }

            cFiltro = "id_cautela = ".concat(selectedCautela.getIdCautela().toString());

            cSql = "DELETE FROM CAUTELA_ACIONISTA WHERE ".concat(cFiltro);
            CautelaAcionistaJpa.executeUpdate(cSql, "S", sessao);

            cSql = "DELETE FROM CAUTELA WHERE ".concat(cFiltro);
            CautelaJpa.executeUpdate(cSql, "S", this.sessao);

            CautelaJpa.closeTransaction(this.sessao);

            // Atualiza os percetuais de participacao
            selectedEmpresa = empresaJpa.getPorId(1);
            cSql = "update cliente "
                    + "set perc_partic = (qde_acao / ".concat(selectedEmpresa.getQdeTotal().toString()).concat(" ) * 100 ");

            clienteJpa.executeUpdate(cSql);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Transferência Estornada com Sucesso!", "");
        } catch (Exception e) {
            lPassa = false;
            if (this.sessao.isOpen()) {
                CautelaJpa.closeSessao(this.sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Erro ao Estornar a Transferência!", "");
        } finally {
            this.sessao = null;
            novo();
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void novo() {
        this.idCedente = 0;
        this.idEdital = 0;
        this.idCautela = 0;
        this.idTipo = 0;
        this.lSessao = true;
        this.disable = true;

        this.totTrans = BigDecimal.ZERO;
        this.vlrUnit = BigDecimal.ZERO;
        this.vlrTotal = BigDecimal.ZERO;

        this.cliente = new Cliente();
        this.selectedCliente = new Cliente();
        this.clienteTrans = new Cliente();
        this.clienteTemp = new Cliente();

        this.selectedEditalCautela = new EditalCautela();
        this.selectedEditalCautelaAcionista = new EditalCautelaAcionista();

        this.selectedTipoTransferencia = new TipoTransferencia();
        this.selectedLivro = new Livro();
        this.selectedClientes = new ArrayList<Cliente>();

        this.ctotReceb = "0";
        this.ctotPerc = "0,0000";
        this.ctotValor = "0,00";

        this.ctotRest = "0";
        this.ctotPercRest = "0,0000";
        this.ctotValorRest = "0,00";

        this.totReceb = BigDecimal.ZERO;
        this.totPerc = BigDecimal.ZERO;
        this.totValor = BigDecimal.ZERO;

        this.totRest = BigDecimal.ZERO;
        this.totPercRest = BigDecimal.ZERO;
        this.totValorRest = BigDecimal.ZERO;

        this.selectedCautela = new Cautela();
        this.selectedCautelaAcionista = new CautelaAcionista();
        this.clienteList = new ArrayList<Cliente>();

        this.anotacaoCedente = new Anotacao();
        this.anotacaoCessionario = new Anotacao();

    }

    public void onRowSelectNavigate(SelectEvent event) {
        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();

        clienteTemp = (Cliente) event.getObject();
        this.idCedente = clienteTemp.getIdCliente();

        msg = null;
        try {
            if (idCedente > 0) {
                cliente = clienteJpa.getPorId(idCedente);
            }
            if (idTipo > 0) {
                selectedTipoTransferencia = tipoTransferenciaJpa.getPorId(idTipo);
            }
            if (selectedEditalCautela == null) {
                selectedEditalCautela = new EditalCautela();
            }
            selectedEditalCautela.setNumCautela(map.get("inNumEdital"));

            if (this.cliente.getQdeAcao().compareTo(BigDecimal.ZERO) == 0) {
                this.cliente = new Cliente();
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Acionista não possui Ações para efetuar Transferências!", "");
            }
        } catch (Exception ex) {
            Logger.getLogger(BairroBean.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (msg != null) {
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        }
    }

    public void onRowSelectNavigateTipoTransf(SelectEvent event) {
        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();
        msg = null;
        try {
            if (selectedEditalCautela == null) {
                selectedEditalCautela = new EditalCautela();
            }
            selectedEditalCautela.setNumCautela(map.get("inNumEdital"));

        } catch (Exception ex) {
            Logger.getLogger(CautelaBean.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (msg != null) {
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        }
    }

    public void verificaValorTransferencia(ActionEvent event) {
        msg = null;
        String cTipo = "N";

        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();
        lPassa = true;
        boolean lFechar = true;

        try {
            if (idCedente > 0) {
                cliente = clienteJpa.getPorId(idCedente);
            }
            if (idTipo > 0) {
                selectedTipoTransferencia = tipoTransferenciaJpa.getPorId(idTipo);
            }

            if (this.totTrans.compareTo(BigDecimal.ZERO) == 0) {
                this.totTrans = new BigDecimal(map.get("totTrans").replace(".", "").replace(",", "."));
                this.totTrans = this.totTrans.setScale(0, BigDecimal.ROUND_HALF_EVEN);
            }

            if (selectedTipoTransferencia == null || selectedTipoTransferencia.getIdTipo() == null) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Obrigatório Definir o Tipo de Operação!", "");
            } else if (cliente == null || cliente.getIdCliente() == null || cliente.getIdCliente() == 0) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Obrigatório selecionar Acionista Cedente!", "");
            } else if (this.totTrans.compareTo(BigDecimal.ZERO) == 0) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Obrigatório Digitar a Qde. de Ações a Transferir!", "");
            } else if (this.cliente.equals(this.clienteTrans)) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Voce não pode Transferir para o mesmo Acionista!", "");
            }

        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Erro do Sistema... ".concat(ex.getMessage()), "");
        } finally {
            if (msg != null) {
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
            if (lPassa) {
                lFechar = false;
            } else {
                this.clienteTrans = new Cliente();
            }
            context.addCallbackParam("loggedIn", lPassa);
            context.addCallbackParam("fechar", lFechar);
        }
    }

    public void onRecuperaEdital() {
        SelectEvent event = null;
        onRecuperaEdital(event);
    }

    public void onRecuperaEdital(SelectEvent event) {
        try {
            // RECUPERA DADOS DO ACIONISTA CEDENTE
            this.selectedTipoTransferencia = selectedCautela.getIdTipo();
            this.cliente = selectedCautela.getIdCliente();
            this.selectedLivro = selectedCautela.getIdLivro();
            this.disable = false;

            this.idCedente = cliente.getIdCliente();
            this.idTipo = this.selectedTipoTransferencia.getIdTipo();
            this.idEdital = selectedCautela.getIdCautela();
            this.totTrans = selectedCautela.getQdeTotal();
            this.vlrUnit = BigDecimal.ZERO;
            this.vlrTotal = BigDecimal.ZERO;

            BigDecimal nQde = BigDecimal.ZERO;
            BigDecimal nPerc = BigDecimal.ZERO;
            BigDecimal nVlr = BigDecimal.ZERO;

            // RECUPERA DADOS DA TRANSFERENCIA
            String cFiltro = " cautela.num_transferencia = ".concat(selectedCautela.getNumTransferencia().toString());

            CautelaList = new ArrayList<Cautela>();
            CautelaList = CautelaJpa.getNative("Cautela", 0, 3, null, true, null, null, cFiltro);

            this.clienteList = new ArrayList<Cliente>();

            if (!CautelaList.isEmpty()) {
                selectedCautela = CautelaList.get(0);
                idCautela = selectedCautela.getIdCautela();
                //cFiltro = " id_cautela = ".concat(selectedCautela.getIdCautela().toString());

                CautelaAcionistaList = new ArrayList<CautelaAcionista>();
                cFiltro = " cautela_acionista.num_transferencia = ".concat(selectedCautela.getNumTransferencia().toString());
                CautelaAcionistaList = CautelaAcionistaJpa.getNative("CautelaAcionista", 0, CautelaAcionistaJpa.getCount("CautelaAcionista"), null, true, null, null, cFiltro);

                nQde = BigDecimal.ZERO;
                nPerc = BigDecimal.ZERO;
                nVlr = BigDecimal.ZERO;

                for (int i = 0; i < CautelaAcionistaList.size(); i++) {
                    selectedCautelaAcionista = new CautelaAcionista();
                    selectedCautelaAcionista = CautelaAcionistaList.get(i);

                    clienteTemp = new Cliente();
                    clienteTemp = selectedCautelaAcionista.getIdCliente();

                    nQde = selectedCautelaAcionista.getQdeAcao();
                    nPerc = nQde.divide(this.totTrans, RoundingMode.HALF_EVEN).setScale(4, RoundingMode.HALF_EVEN);
                    nVlr = this.vlrUnit.multiply(nQde).setScale(2, RoundingMode.HALF_EVEN);
                    nQde = nQde.setScale(0, RoundingMode.HALF_EVEN);

                    clienteTemp.setQdeFinal(nQde);
                    clienteTemp.setQdePercFinal(nPerc);
                    clienteTemp.setQdeVlrFinal(nVlr);

                    this.clienteList.add(clienteTemp);
                }

                // SUB-TOTAL
                this.totReceb = BigDecimal.ZERO;
                this.totPerc = BigDecimal.ZERO;
                this.totValor = BigDecimal.ZERO;

                for (int i = 0; i < clienteList.size(); i++) {
                    clienteTemp = new Cliente();
                    clienteTemp = clienteList.get(i);

                    this.totReceb = this.totReceb.add(clienteTemp.getQdeFinal());
                    this.totPerc = this.totPerc.add(clienteTemp.getQdePercFinal());
                    this.totValor = this.totValor.add(clienteTemp.getQdeVlrFinal());
                }

                // TOTAL RESTANTE
                this.totReceb = this.totReceb.setScale(0, BigDecimal.ROUND_HALF_EVEN);
                this.totPerc = this.totPerc.setScale(4, BigDecimal.ROUND_HALF_EVEN);
                this.totValor = this.totValor.setScale(2, BigDecimal.ROUND_HALF_EVEN);

                if (this.totPerc.compareTo(new BigDecimal(1.00)) > 0) {
                    this.totPerc = new BigDecimal(1.00);
                }

                BigDecimal nTotPerc = new BigDecimal(1.00);
                nTotPerc = nTotPerc.setScale(4, BigDecimal.ROUND_HALF_EVEN);

                // TOTAL RESTANTE
                this.totRest = this.totTrans.subtract(this.totReceb);
                this.totPercRest = nTotPerc.subtract(this.totPerc);
                this.totValorRest = this.vlrTotal.subtract(this.totValor);

                if (this.totRest.compareTo(BigDecimal.ZERO) < 0) {
                    this.totRest = BigDecimal.ZERO;
                }
                if (this.totPercRest.compareTo(BigDecimal.ZERO) < 0) {
                    this.totPercRest = BigDecimal.ZERO;
                }
                if (this.totValorRest.compareTo(BigDecimal.ZERO) < 0) {
                    this.totValorRest = BigDecimal.ZERO;
                }

                // TOTAIS FORMATADOS
                this.ctotReceb = funcoes.FormataValor(this.totReceb, 0);
                this.ctotPerc = funcoes.FormataValor(this.totPerc, 4);
                this.ctotValor = funcoes.FormataValor(this.totValor, 2);

                this.ctotRest = funcoes.FormataValor(this.totRest, 0);
                this.ctotPercRest = funcoes.FormataValor(this.totPercRest, 4);
                this.ctotValorRest = funcoes.FormataValor(this.totValorRest, 2);
            }
        } catch (EaoException ex) {
            Logger.getLogger(CautelaBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public LazyDataModel<Cliente> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<Cliente> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public Cautela getSelectedCautela() {
        if (selectedCautela == null) {
            selectedCautela = new Cautela();
        }
        return selectedCautela;
    }

    public void setSelectedCautela(Cautela selectedCautela) {
        this.selectedCautela = selectedCautela;
    }

    public Cliente getSelectedCliente() {
        return selectedCliente;
    }

    public void setSelectedCliente(Cliente selectedCliente) {
        if (selectedCliente == null) {
            selectedCliente = new Cliente();
            selectedCliente.setQdeFinal(BigDecimal.ZERO);
            selectedCliente.setQdePerc(BigDecimal.ZERO);
            selectedCliente.setQdePercFinal(BigDecimal.ZERO);
            selectedCliente.setQdeReceb(BigDecimal.ZERO);
            selectedCliente.setQdeVlr(BigDecimal.ZERO);
            selectedCliente.setQdeVlrFinal(BigDecimal.ZERO);
        }
        this.selectedCliente = selectedCliente;
    }

    public TipoTransferencia getSelectedTipoTransferencia() {
        return selectedTipoTransferencia;
    }

    public void setSelectedTipoTransferencia(TipoTransferencia selectedTipoTransferencia) {
        this.selectedTipoTransferencia = selectedTipoTransferencia;
    }

    public Livro getSelectedLivro() {
        if (selectedLivro == null || selectedLivro.getIdLivro() == null) {
            selectedLivro = new Livro();
        }
        return selectedLivro;
    }

    public void setSelectedLivro(Livro selectedLivro) {
        this.selectedLivro = selectedLivro;
    }

    public List<Cliente> getSelectedClientes() {
        return selectedClientes;
    }

    public void setSelectedClientes(List<Cliente> selectedClientes) {
        this.selectedClientes = selectedClientes;
    }

    public List<Cliente> getClienteList() {
        return clienteList;
    }

    public void setClienteList(List<Cliente> clienteList) {
        this.clienteList = clienteList;
    }

    public String getDataatual() {
        return dataatual;
    }

    public void setDataatual(String dataatual) {
        this.dataatual = dataatual;
    }

    public CautelaAcionista getSelectedCautelaAcionista() {
        return selectedCautelaAcionista;
    }

    public void setSelectedCautelaAcionista(CautelaAcionista selectedCautelaAcionista) {
        this.selectedCautelaAcionista = selectedCautelaAcionista;
    }

    public BigDecimal getTotPerc() {
        return totPerc;
    }

    public void setTotPerc(BigDecimal totPerc) {
        this.totPerc = totPerc;
    }

    public BigDecimal getTotValor() {
        return totValor;
    }

    public void setTotValor(BigDecimal totValor) {
        this.totValor = totValor;
    }

    public BigDecimal getVlrTotal() {
        return vlrTotal;
    }

    public void setVlrTotal(BigDecimal vlrTotal) {
        this.vlrTotal = vlrTotal;
    }

    public BigDecimal getVlrUnit() {
        return vlrUnit;
    }

    public void setVlrUnit(BigDecimal vlrUnit) {
        this.vlrUnit = vlrUnit;
    }

    public BigDecimal getTotPercRest() {
        return totPercRest;
    }

    public void setTotPercRest(BigDecimal totPercRest) {
        this.totPercRest = totPercRest;
    }

    public BigDecimal getTotValorRest() {
        return totValorRest;
    }

    public void setTotValorRest(BigDecimal totValorRest) {
        this.totValorRest = totValorRest;
    }

    public BigDecimal getTotReceb() {
        return totReceb;
    }

    public void setTotReceb(BigDecimal totReceb) {
        this.totReceb = totReceb;
    }

    public BigDecimal getTotRest() {
        return totRest;
    }

    public void setTotRest(BigDecimal totRest) {
        this.totRest = totRest;
    }

    public BigDecimal getTotTrans() {
        return totTrans;
    }

    public void setTotTrans(BigDecimal totTrans) {
        this.totTrans = totTrans;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        if (cliente == null) {
            cliente = new Cliente();
        }
        this.cliente = cliente;
    }

    public String getCtotPerc() {
        return ctotPerc;
    }

    public void setCtotPerc(String ctotPerc) {
        this.ctotPerc = ctotPerc;
    }

    public String getCtotPercRest() {
        return ctotPercRest;
    }

    public void setCtotPercRest(String ctotPercRest) {
        this.ctotPercRest = ctotPercRest;
    }

    public String getCtotReceb() {
        return ctotReceb;
    }

    public void setCtotReceb(String ctotReceb) {
        this.ctotReceb = ctotReceb;
    }

    public String getCtotRest() {
        return ctotRest;
    }

    public void setCtotRest(String ctotRest) {
        this.ctotRest = ctotRest;
    }

    public String getCtotValor() {
        return ctotValor;
    }

    public void setCtotValor(String ctotValor) {
        this.ctotValor = ctotValor;
    }

    public String getCtotValorRest() {
        return ctotValorRest;
    }

    public void setCtotValorRest(String ctotValorRest) {
        this.ctotValorRest = ctotValorRest;
    }

    public Cliente getClienteTrans() {
        return clienteTrans;
    }

    public void setClienteTrans(Cliente clienteTrans) {
        this.clienteTrans = clienteTrans;
    }

    public String getNumEdital() {
        return numEdital;
    }

    public void setNumEdital(String numEdital) {
        this.numEdital = numEdital;
    }

    public LazyDataModel<Cautela> getLazyModelEdital() {
        return lazyModelEdital;
    }

    public void setLazyModelEdital(LazyDataModel<Cautela> lazyModelEdital) {
        this.lazyModelEdital = lazyModelEdital;
    }

    public Cliente getClienteTransferencia() {
        return clienteTransferencia;
    }

    public void setClienteTransferencia(Cliente clienteTransferencia) {
        this.clienteTransferencia = clienteTransferencia;
    }

    public EntityManager getSessao() {
        return sessao;
    }

    public void setSessao(EntityManager sessao) {
        this.sessao = sessao;
    }

    public int getIdCedente() {
        return idCedente;
    }

    public void setIdCedente(int idCedente) {
        this.idCedente = idCedente;
    }

    public int getIdTipo() {
        return idTipo;
    }

    public void setIdTipo(int idTipo) {
        this.idTipo = idTipo;
    }

    public int getIdEdital() {
        return idEdital;
    }

    public void setIdEdital(int idEdital) {
        this.idEdital = idEdital;
    }

    public int getIdCautela() {
        return idCautela;
    }

    public void setIdCautela(int idCautela) {
        this.idCautela = idCautela;
    }

    public Anotacao getAnotacaoCedente() {
        return anotacaoCedente;
    }

    public void setAnotacaoCedente(Anotacao anotacaoCedente) {
        this.anotacaoCedente = anotacaoCedente;
    }

    public Anotacao getAnotacaoCessionario() {
        return anotacaoCessionario;
    }

    public void setAnotacaoCessionario(Anotacao anotacaoCessionario) {
        this.anotacaoCessionario = anotacaoCessionario;
    }

    public void onEditRow(RowEditEvent event) {
        ActionEvent ActionEvent = null;
        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();

        boolean lFechar = true;

        try {
            this.clienteTrans = (Cliente) event.getObject();

            verificaValorTransferencia(ActionEvent);

            if (this.lPassa) {
                this.totReceb = BigDecimal.ZERO;

                if (this.clienteList == null) {
                    this.clienteList = new ArrayList<Cliente>();
                } else {
                    if (this.clienteList.contains(this.clienteTrans)) {
                        this.clienteList.remove(this.clienteTrans);
                    }
                }

                for (int i = 0; i < clienteList.size(); i++) {
                    clienteTemp = clienteList.get(i);
                    this.totReceb = this.totReceb.add(clienteTemp.getQdeFinal());
                }

                if (this.clienteTrans.getQdeFinal().intValue() > 0) {
                    this.totReceb = this.totReceb.add(this.clienteTrans.getQdeFinal());
                }

                int nComp1 = this.totTrans.intValue();
                int nComp2 = this.totReceb.intValue();

                if (nComp2 > nComp1) {
                    this.totReceb = this.totReceb.subtract(this.clienteTrans.getQdeFinal());
                    msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Qde. Maior que a Definida!", "");
                } else {
                    if (this.clienteTrans.getQdeFinal().intValue() > 0) {
                        this.clienteList.add(this.clienteTrans);
                    }
                }

                this.totRest = this.totTrans.subtract(this.totReceb);

                this.ctotReceb = funcoes.FormataValor(this.totReceb, 0);
                this.ctotRest = funcoes.FormataValor(this.totRest, 0);
            }
        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Erro do Sistema... ".concat(ex.getMessage()), "");
        } finally {
            this.clienteTrans = new Cliente();

            if (msg != null) {
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
            if (lPassa) {
                lFechar = false;
            }
            context.addCallbackParam("loggedIn", lPassa);
            context.addCallbackParam("fechar", lFechar);
        }

    }

    public boolean isDisable() {
        return disable;
    }

    public void setDisable(boolean disable) {
        this.disable = disable;
    }
}
